#include "RBTree.hpp"

namespace zty{
  template <class K, class V>
  class map{
    struct MapKofT{
      const K& operator()(const pair<K,V> &kv){
        return kv.first;
      }
    };
    typedef RBTree<K, pair<K,V>, MapKofT> RBT;
    RBT _rbt;

  public:
    typedef typename RBT::iterator iterator;
    typedef typename RBT::const_iterator const_iterator;

    map() = default;

    template <class InputIterator>
      map(InputIterator first, InputIterator last){
        while(first!=last)
        {
          _rbt.Insert(*first);
          ++first;
        }
      }

    iterator begin(){
      return _rbt.begin();
    }

    iterator end(){
      return _rbt.end();
    }

    const_iterator begin() const{
      return _rbt.begin();
    }

    const_iterator end() const{
      return _rbt.end();
    }

    std::pair<iterator, bool> insert(const pair<K,V> &kv){
      return _rbt.Insert(kv);
    }

    V& operator[](const K& k){
      pair<iterator, bool> ret = _rbt.Insert(make_pair(k, V()));
      return ret.first->second;
    }

    iterator find(const K& k){
      return _rbt.Find(k);
    }
  };
}
